package controladores;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import modelo.Categoria;
import modelo.Consumidor;
import modelo.Ingreso;
import modelo.Usuario;
import negocio.CategoriaBI;
import negocio.ConsumidorBI;
import negocio.ConsumibleBI;
import negocio.IngresoBI;
import negocio.UsuarioBI;

@ManagedBean(name="crearIngresoCtrl")
@ViewScoped
public class CrearIngresoCtrl implements Serializable{
    private static final long serialVersionUID=1L;
    
    @Inject
    private ConsumidorBI consumidorBI;
    @Inject
    private CategoriaBI categoriaBI;
    @Inject
    private IngresoBI ingresoBI;
    @Inject
    private UsuarioBI usuarioBI;
    
    private LoginCtrl login;
    private Usuario usuario;
    private List<String> idCategoriasIngreso;
    private String nombre;
    private String descripcion;
    private Integer periodicidad;
    private Integer idConsumidor;
    private Double monto;
    private Map<String, Integer> consumidores;
    
    @PostConstruct
    public void init(){
        try{
            login = (LoginCtrl)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("login");
            String nombreUsuario = login.getUsuario();
            usuario = usuarioBI.buscarUsuario(nombreUsuario);
            List<Consumidor> consumidoresUsu = consumidorBI.buscarConsumidoresPorUsuario(usuario.getIdUsuario());
            consumidores = new HashMap<String, Integer>();
            for (Consumidor consumidor : consumidoresUsu) {
                consumidores.put(consumidor.getNombre(), consumidor.getIdConsumidor());
            }
        }catch(Exception e){
            FacesContext.getCurrentInstance()
                    .addMessage(null, 
                        new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error", e.getMessage()));
        }
    }
    
    public void guardar() throws Exception{
        try{
            Ingreso ingreso = new Ingreso();
            ingreso.setNombre(nombre);
            ingreso.setDescripcion(descripcion);
            Consumidor consumidor = consumidorBI.buscarConsumidor(Integer.valueOf(idConsumidor));
            ingreso.setIdConsumidor(consumidor);
            if(idCategoriasIngreso != null && idCategoriasIngreso.size()>0) {
                ArrayList<Categoria> categorias = new ArrayList<Categoria>();
                for(String idCategoria : idCategoriasIngreso)
                {
                   categorias.add(categoriaBI.buscarCategoria(Integer.valueOf(idCategoria))); 
                }
                ingreso.setCategoriaList(categorias);
            }
            ingreso.setPeriodicidad(periodicidad);
            if(monto!=null){
                ingreso.setMonto(BigDecimal.valueOf(monto));
            }
            ingreso.setEstatus("A");
            ingreso.setCapital(BigDecimal.valueOf(0));
            ingreso.setRetencion(BigDecimal.valueOf(0));
            ingreso.setFechaCreacion(new Date());
            ingresoBI.crear(ingreso);
            FacesContext.getCurrentInstance()
                    .addMessage(null, 
                        new FacesMessage(FacesMessage.SEVERITY_INFO, "Listo", "Guardado con éxito"));
        }catch(Exception e){
            e.printStackTrace();
            FacesContext.getCurrentInstance()
                    .addMessage(null, 
                        new FacesMessage(FacesMessage.SEVERITY_ERROR, "No se pudo crear el ingreso", e.getMessage()));
        }
    }

    public Integer getIdConsumidor() {
        return idConsumidor;
    }

    public void setIdConsumidor(Integer idConsumidor) {
        this.idConsumidor = idConsumidor;
    }

    public Map<String, Integer> getConsumidores() {
        return consumidores;
    }

    public void setConsumidores(Map<String, Integer> consumidores) {
        this.consumidores = consumidores;
    }

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public String getDescripcion() {
        return descripcion;
    }

    public void setDescripcion(String descripcion) {
        this.descripcion = descripcion;
    }

    public Integer getPeriodicidad() {
        return periodicidad;
    }

    public void setPeriodicidad(Integer periodicidad) {
        this.periodicidad = periodicidad;
    }

    public Double getMonto() {
        return monto;
    }

    public void setMonto(Double monto) {
        this.monto = monto;
    }
    

    public List<String> getIdCategoriasIngreso() {
        return idCategoriasIngreso;
    }

    public void setIdCategoriasIngreso(List<String> idCategoriasIngreso) {
        this.idCategoriasIngreso = idCategoriasIngreso;
    }
    

    public ConsumidorBI getConsumidorBI() {
        return consumidorBI;
    }

    public void setConsumidorBI(ConsumidorBI consumidorBI) {
        this.consumidorBI = consumidorBI;
    }

    public CategoriaBI getCategoriaBI() {
        return categoriaBI;
    }

    public void setCategoriaBI(CategoriaBI categoriaBI) {
        this.categoriaBI = categoriaBI;
    }

    public LoginCtrl getLogin() {
        return login;
    }

    public void setLogin(LoginCtrl login) {
        this.login = login;
    }

    public Usuario getUsuario() {
        return usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }
    
}
